void test1()
{
	/*两个数简单计算*/
    int i, l, k, a, c, d;
    char b, e[30];
	i = l = k = a = c = d = 0;

	printf("请输入字符串表达式（例如：1+1）：");
    gets(e);
    printf("录入的字符串为：%s\n", e);

	// 得到符号位及运算符
	while (e[i] != '\0')
	{
		if(e[i] == '+' || e[i] == '-' || e[i] == '*' || e[i] == '/'){
			k = i; // 运算符位置
			b = e[k]; // 运算符
		}
		++i;
	}
	l = i; // 字符串长度

    printf("符号位为：%d\n", k);
    printf("字符串长度为：%d\n", l);

	// 得到左边数字
	for (i = 0; i < k; ++i) 
		a = a * 10 + (e[i] - '0');
    printf("左边数为：%d\n", a);

	// 得到右边数字
	for (i = k + 1; i < l; ++i) 
		c = c * 10 + (e[i] - '0');
    printf("右边数为：%d\n", c);

	switch (b)
	{
		case '+':
		d = a + c;
		break;

		case '-':
		d = a - c;
		break;

		case '*':
		d = a * c;
		break;

		case '/':
		d = a / c;
		break;

		default:
		printf("运算符错误！！\n");
		exit(0);
		break;
	}

	printf("%s=%d\n", e, d);
}

void test2()
{
	printf("猜数字游戏, 随机产生一个1~100的整数，玩家从键盘输入一个数字，如果与随机产生的数字相同则胜利\n");
	
	int a, b, c = 0, s = 1, e = 100;

	a = rand() % 100 + 1; // 0~99 + 1 => 1~100
	printf("随机数是：%d\n", a);

	while (1)
	{
		++c;

		printf("请输入一个 大于%d且小于%d 的整数：", s, e);
		scanf("%d", &b);
		
		if (b < a) 
		{
			if (b > s) s = b;
			printf("猜的数字比较小，请重新猜测！！\n");
		}

		if (b == a) 
		{
			printf("恭喜您猜对了！！！总共猜测了%d次\n", c);
			break;
		} 
		
		if (b > a) 
		{
			if (b < e) e = b;
			printf("猜的数字比较大，请重新猜测！！\n");
		}
	}
}

void test3()
{
	printf("随机一个5位数没有重复数字的密码,用户猜测密码，程序需提醒用户几个密码正确，几个位置正确\n");

	// 随机密码 玩家猜测密码 随机密码容器 玩家猜测密码容器 正确密码个数 正确密码位置个数 for循环计数
	int a, b, *c, *d, e, f, h = 1, i;
	char g; // 是否继续猜测 任意键:继续 n:结束

	// 创建随机密码
	a = getRandNoRepeatInteger(5);
	printf("随机密码是%d\n", a);

	// 将密码拆分保存到容器
	c = splitInt(a);
	printf("打印密码数组：");
	outArrInt(c, 5);

	while (1)
	{
		Loop:
		e = f = 0; // 正确密码个数 正确密码位置个数

		printf("请猜测一个不重复的5位数：");
		scanf("%d", &b);

		if (getIntLen(b) != 5) 
		{
			getchar();
			printf("猜测数字位数不正确！！\n");
			goto Loop;
		}

		// 将猜测密码拆分保存到容器
		d = splitInt(b);
		printf("打印猜测密码数组：");
		outArrInt(d, 5);

		// 得到 正确密码个数 正确密码位置个数
		for (i = 0; i < 5; ++i)
		{
			if (inArrInt(c[i], d, 5)) ++e;
			if (c[i] == d[i]) ++f;
		}

		if (e == 5 && f == 5)
		{
			printf("恭喜您猜对了！！\n");
			exit(0);
		}

		printf("猜测正确密码个数是：%d\n猜测正确密码位置个数是：%d\n请继续努力！！\n", e, f);
		
		if (h) 
		{
			getchar();
			printf("按'n'结束，按'h'忽略此条提示，按其他字母继续：");
			scanf("%c", &g);
			
			if (g == 'n' || g == 'N') {
				printf("期待您再次来玩！！\n");
				break;
			}

			if (g == 'h' || g == 'H')
				h = 0;

			getchar();
		}
		
		// 释放动态分配 d的内存
		free(d);
		d = NULL;
	}

	// 释放动态分配 c的内存
	free(c);
	c = NULL;
}

void test4()
{
	printf("有问题的里程表（2）\n");
	printf("某辆汽车有一个里程表，该里程表可以显示一个整数，为该车走过的公里数。然而这个里程表有个毛病：它总是从3变到5，而跳过数字4，里程表所有为（个位、十位、百位等）上的数字都是如此。例如，如果历程表显示15339，汽车走过1公里之后，该里程表显示15350。\n");

	int a, b, c, d = 0, n = 0;

	printf("请输入一个整数，表示里程表显示的数值，长度不超过9位，且一定不含整数4:");
	scanf("%d", &a);
	
	b = a;
	while (b > 0)
	{
		c = b % 10;
		if (c > 4) --c;
		d += c * pow(9.0, n);
		b /= 10;
		++n;
	}

	printf("里程表数%d：%d\n", a, d);
}

// 递归 返回 x 的 n 次方
int funpower(int x, int n)
{	
	return n ? funpower(x, n - 1) * x : 1;
}

void test5()
{
	int num[8] = {11, 12, 13, 14, 15, 16, 17, 18};
	int score[8] = {90, 85, 95, 85, 99, 80, 75, 88};
	int i, j ,a;

	for (i = 0; i < 8; ++i)
	{
		for (j = i; j < 8; ++j)
		{
			if (score[i] < score[j]) {
				a = score[i];
				score[i] = score[j];
				score[j] = a;

				a = num[i];
				num[i] = num[j];
				num[j] = a;
			}
		}
	}

	printf("学号 分数 名次\n");
	for (i = 0; i < 8; ++i)
	{
		printf("%d %d %d\n", num[i], score[i], i + 1);
	}
}

void test6()
{
	printf("求在[2，1000]之间的所有同构数之和（某正整数的平方，其低位与该数本身相同，则称该数为同构数。例如25^2=625，625的低位25与原数相同，则称25为同构数）。\n");

	int i, a, b, c, l, sum = 0;

	for (i = 2; i < 1001; ++i) {
		l = 1;
		a = c = i * i;
		b = i;

		while (b > 0) {
			if (a % 10 != b % 10) {
				l = 0;
				break;
			}

			a /= 10;
			b /= 10;
		}

		if (l) {
			printf("%d %d\n", i, c);
			sum += i;
		}
	}

	printf("同构数之和为：%d\n", sum);
}

int Test()
{
	// test1();
	// test2();
	// test3();
	// test4();
	// test5();
	test6();
	
	return 0;
}
